{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Constructing Confidence Intervals"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Author: Sebastian Raschka\n",
      "\n",
      "Python implementation: CPython\n",
      "Python version       : 3.10.6\n",
      "IPython version      : 8.12.0\n",
      "\n",
      "numpy     : 1.23.5\n",
      "mlxtend   : 0.22.0\n",
      "matplotlib: 3.7.1\n",
      "sklearn   : 1.2.2\n",
      "\n"
     ]
    }
   ],
   "source": [
    "%load_ext watermark\n",
    "%watermark -a 'Sebastian Raschka' -v -p numpy,mlxtend,matplotlib,sklearn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Defining a Dataset and Model for Hands-on Examples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_digits\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "\n",
    "digits = load_digits()\n",
    "\n",
    "X = digits.data / 16. - 0.5 # normalizes datast into -0.5 to 0.5 range\n",
    "y = digits.target\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    X, y, test_size=0.15, random_state=123, stratify=y\n",
    ")\n",
    "\n",
    "clf = MLPClassifier(\n",
    "    hidden_layer_sizes=(10,),\n",
    "    activation=\"relu\",\n",
    "    learning_rate_init=0.01,\n",
    "    random_state=123,\n",
    "    solver=\"adam\",\n",
    "    max_iter=500\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1) Normal Approximation Interval Based on the Test Set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Computing the z-value, which can obtain from `scipy.stats.norm.ppf` rather than looking it up from a $z$ table in one of our old statistics textbook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.959963984540054\n"
     ]
    }
   ],
   "source": [
    "import scipy.stats\n",
    "\n",
    "confidence = 0.95  # Change to your desired confidence level\n",
    "z_value = scipy.stats.norm.ppf((1 + confidence) / 2.0)\n",
    "print(z_value)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Next, let's compute the test accuracy of the classifier, and plug in the values into the formula above; the Python code for this is as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9601953017724117 0.9953602537831437\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "clf.fit(X_train, y_train)\n",
    "\n",
    "acc_test = clf.score(X_test, y_test)\n",
    "ci_length = z_value * np.sqrt((acc_test * (1 - acc_test)) / y_test.shape[0])\n",
    "\n",
    "ci_lower = acc_test - ci_length\n",
    "ci_upper = acc_test + ci_length\n",
    "\n",
    "print(ci_lower, ci_upper)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Let's visualize the confidence interval using the following code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArIAAAEiCAYAAAAF9zFeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAo+klEQVR4nO3deXyNZ/7/8ffJvkhiT6SW0FRRsdfeUnzF0D6omkqpnS6+rVIdOtWIjrHV2JUaJdEWqVLGDA/rl34tRWnigWS0ltBOLYMZWwbB9fujv5yvIxFJJDmu9PV8PPJ49Nz3da7r+py7l7zd575vDmOMEQAAAGAZD3dPAAAAAMgPgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAK3m5ewIA7u327dv6+eefFRQUJIfD4e7pAACQhTFGly9fVnh4uDw8ivYcKUEWeIj9/PPPqlSpkrunAQDAff3444+qWLFikY5JkAUeYkFBQZKk48ePq3Tp0m6eTcHIyMjQhg0b1L59e3l7e7t7OgWmONZFTfYojnUVx5qk4lnXhQsXVLVqVefvrKJEkAUeYpmXEwQFBSk4ONjNsykYGRkZCggIUHBwcLH5Q1wqnnVRkz2KY13FsSapeNaVkZEhSW65BI6bvQAAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYKVfRZDdunWrHA6H/v3vf7t7KoWmdevWGjp0qFvGLqrP1501FpQxY8aoXr167p4GAOAhcuu20TdHz+svyf/QN0fP69Zt4+4pWcMrL4379u2rRYsWacKECXr33Xed21etWqXnn39exvDBu8tXX30lb2/vQh+ndevWqlevnqZPn+7c1rx5c506dUohISGFOnZea0xLS1PVqlWVlJREeAQAPJTWHTylD/6aolMXrzm3VQjxU9xztdShdgU3zswOeT4j6+fnp0mTJulf//pXgU7kxo0bBdqfLQqq7tKlSysoKKhA+sorHx8fhYWFyeFwFOo47qwxIyPDLeMCAIqvdQdP6fXPv3MJsZJ0+uI1vf75d1p38JSbZmaPPAfZdu3aKSwsTBMmTMix3YoVK/TEE0/I19dXERERmjJlisv+iIgI/fGPf1Tfvn0VEhKiQYMGKSEhQSVLltTf/vY3Pf744woICFC3bt109epVLVq0SBERESpVqpTefPNN3bp1y9nX559/rkaNGikoKEhhYWHq0aOHzp49m6e6pk6dqqioKAUGBqpSpUoaPHiwrly54tyfObdVq1apevXq8vPz03/913/pxx9/dLbJ/Np43rx5qlSpkgICAvTb3/7W5Sv3vn37qkuXLpowYYLCw8NVvXp1SdKBAwfUpk0b+fv7q0yZMnrllVec42/dulU+Pj7atm2bs58pU6aobNmyOnXql//J7/7aPfPz7d27t0qUKKEqVaroL3/5i/75z3+qc+fOKlGihKKiorR3717ne86fP6+XXnpJFStWVEBAgKKiorR06VKXuX/99deaMWOGHA6HHA6H0tLSsr20IDfHf/z48erfv7+CgoJUuXJl/fnPf87xGGVXY059VK1aVZJUv359ORwOtW7d2rkvPj5eNWvWlJ+fn2rUqKE5c+Y496WlpcnhcGjZsmVq3bq1/Pz8NGfOHPn7+2vdunUuc/rqq68UGBjoPFYjR45U9erVFRAQoGrVqik2NpYQDAAPmfQbN936c/2WdPlahuJWH1J232VnbhuzOkWXr2W4da4PuzxdWiBJnp6eGj9+vHr06KEhQ4aoYsWKWdrs27dPL774osaMGaPu3btr586dGjx4sMqUKaO+ffs6202ePFmxsbF6//33JUnbt29Xenq6Zs6cqcTERF2+fFldu3ZV165dVbJkSa1du1bHjh3TCy+8oJYtW6p79+6SfjmrOXbsWD3++OM6e/ashg0bpr59+2rt2rW5rsvDw0MzZ85URESEjh8/rsGDB2vEiBEuASc9PV3jxo3TokWL5OPjo8GDBysmJkY7duxwtjly5IiWLVumv/71r7p06ZIGDBig//7v/9bixYudbTZv3qzg4GBt3LhRxhilp6erQ4cOatq0qb799ludPXtWAwcO1BtvvKGEhARngOvVq5f279+vtLQ0jRo1SkuXLlWFCvf+2mHatGkaP368YmNjNW3aNPXq1UstWrRQ//79NXnyZI0cOVK9e/fWoUOH5HA4dO3aNTVs2FAjR45UcHCw1qxZo169eqlatWpq0qSJZsyYoe+//161a9fWH/7wB0lSuXLllJaWlq/jP2XKFI0dO1bvvfeeli9frtdff11PP/20atSokevjllMfe/bsUePGjbVp0yY98cQT8vHxkSTNnz9fcXFxmj17turXr6+kpCQNGjRIgYGB6tOnj7PvkSNHasqUKYqPj5evr6+2bdumxYsXq0OHDs42S5Yscf7FQJKCgoKUkJCg8PBwHThwQIMGDVJQUJBGjBiRq3quX7+u69evO19funQp158FACB3ao1e7+YZeEl7tuTYwkg6femaosZsKJop3UPaxE5uHf9+8hxkJen5559XvXr1FBcXpwULFmTZP3XqVLVt21axsbGSpOrVqyslJUWTJ092CTJt2rTRO++843y9fft2ZWRkaO7cuXr00UclSd26ddNnn32mM2fOqESJEqpVq5aeeeYZbdmyxRlk+/fv7+yjWrVqmjlzpho3bqwrV644A8b93Hmmr2rVqho7dqxef/11lyCbkZGh2bNnq0mTJpKkRYsWqWbNms7AJEnXrl3TokWLnAF/1qxZ6tSpk6ZMmaKwsDBJUmBgoD755BOXYPWf//xHn376qQIDAyVJs2fP1nPPPadJkyYpNDRUf/zjH7Vp0ya98sorOnTokHr16qXnn38+x5o6duyoV199VZI0evRozZ07V08++aR++9vfSvolqDVr1kxnzpxRWFiYHnnkEZfj8eabb2rdunX68ssv1aRJE4WEhMjHx0cBAQHOWrKT2+PfsWNHDR482DmXadOmaevWrXkKsjn1Ua5cOUlSmTJlXOY7duxYTZkyRV27dpX0y/FOSUnRvHnzXILs0KFDnW0kqWfPnurdu7fS09MVEBCgS5cuac2aNVqxYoWzTeZfyqRfzhgPHz5cX3zxRa6D7IQJE/TBBx/kun4AAH7N8hVkJWnSpElq06aNhg8fnmVfamqqOnfu7LKtRYsWmj59um7duiVPT09JUqNGjbK8NyAgwBliJSk0NFQREREugTQ0NNTl0oGkpCSNGTNGycnJunDhgm7fvi1JOnnypGrVqpWrerZs2aLx48crJSVFly5d0s2bN3Xt2jVdvXrVGS69vLxc5lyjRg2VLFlSqampziBbuXJll7PUzZo10+3bt3X48GFnmIqKinKG2MzPq27dus5xMj+vzPeFhobKx8dHn3/+uerUqaMqVaq43Gx1L3Xq1HH5zDLHvnvb2bNnFRYWplu3bmnixIn64osv9I9//MN5dvDOeeVGbo//nfNzOBwKCwvL8yUhee3jn//8p3788UcNGDBAgwYNcm6/efNmlpvV7v7/s1OnTvLy8tLq1asVExOjFStWKCgoSO3bt3e2Wb58uaZPn64jR47oypUrunnzpoKDg3Ndz+9//3u9/fbbzteXLl1SpUqVcv1+AMD9pfwh2m1jZ2RkaP36DSr9+JMa+FnSfdsn9HtSjauWLoKZ2SnfQfbpp59WdHS03nvvPZezbJJkjMly4092TzTILiDdfVe6w+HIdltmWL169arat2+v9u3b6/PPP1e5cuV08uRJRUdH5/pGqhMnTqhjx4567bXXNHbsWJUuXVrbt2/XgAEDslzfmN0NTTnd5JS57842d9ed3eeVXd87d+6UJF24cEEXLly4b8C883PL7Ce7bZmf5ZQpUzRt2jRNnz7deb3w0KFD83xDWm6Pf07HNbfy2kfmvvnz5zvPrGfKDNiZ7v58fXx81K1bNy1ZskQxMTFasmSJunfvLi+vX5bRrl27FBMTow8++EDR0dEKCQlRYmJiluuDc+Lr6ytfX99ctwcA5F2AT77jzwPLcBj5ekotI8uqQoifTl+8lu11sg5JYSF+euqxcvL0KNybqW32QM+RnThxov761786A1amWrVqafv27S7bdu7cqerVq2cJCw/q73//u86dO6eJEyfqqaeeUo0aNfJ8Vm/v3r26efOmpkyZoqZNm6p69er6+eefs7S7efOmy81Rhw8f1r///W+Xr8JPnjzp8t5vvvlGHh4ezpu6slOrVi0lJyfr6tWrzm07duxwed/Ro0c1bNgwzZ8/X02bNlXv3r3zHPruZ9u2bercubNefvll1a1bV9WqVdMPP/zg0sbHx8flRrt71VNUxz8nmWe975xvaGioHnnkER07dkyRkZEuP5k3h+WkZ8+eWrdunQ4dOqQtW7aoZ8+ezn07duxQlSpVNGrUKDVq1EiPPfaYTpw4UfCFAQCs5+nhUNxzv3xrfHdMzXwd91wtQux9PFCQjYqKUs+ePTVr1iyX7cOHD9fmzZs1duxYff/991q0aJFmz57tcv1lQalcubJ8fHw0a9YsHTt2TKtXr9bYsWPz1Mejjz6qmzdvOvv47LPP9PHHH2dp5+3trTfffFO7d+/Wd999p379+qlp06bOywqkXx5P1qdPH+3fv1/btm3TkCFD9OKLL+Z4TWnPnj2d7zt48KC2bNmiN998U7169VJoaKhu3bqlXr16qX379urXr5/i4+N18ODBPJ3py43IyEht3LhRO3fuVGpqql599VWdPn3apU1ERIR2796ttLQ0nTt3LtswXZTHPyfly5d3PmngzJkzunjxoqRfni4xYcIE581rBw4cUHx8vKZOnXrfPlu1aqXQ0FD17NlTERERatq0qXNfZGSkTp48qcTERB09elQzZ87UypUrC60+AIDdOtSuoLkvN1BYiJ/L9rAQP819uQHPkc2FB/6XvcaOHZvla+MGDRpo2bJlSkxMVO3atTV69Gj94Q9/yHIJQkEoV66cEhIS9OWXX6pWrVqaOHGi/vSnP+Wpj3r16mnq1KmaNGmSateurcWLF2f7eLGAgACNHDlSPXr0ULNmzeTv76/ExESXNpGRkeratas6duyo9u3bq3bt2i43jGUnICBA69ev14ULF/Tkk0+qW7duatu2rWbPni1JGjdunNLS0pyPlgoLC9Mnn3yi999/X8nJyXmqNSexsbFq0KCBoqOj1bp1a4WFhalLly4ubd555x15enqqVq1azss47laUxz8nXl5emjlzpubNm6fw8HDndbsDBw7UJ598ooSEBEVFRalVq1ZKSEjI1RlZh8Ohl156Sfv373c5GytJnTt31rBhw/TGG2+oXr162rlzp/OGNwAAstOhdgVtH9lGSwc11YyYelo6qKm2j2xDiM0lh+Gf48qVhIQEDR06NMd/hnXMmDFatWpVgYZL/LpdunRJISEhOnfunMqUKePu6RSIjIwMrV27Vh07diySf42uqBTHuqjJHsWxruJYk1Q86zp//rzKli2rixcv5ukG54LwwGdkAQAAAHcgyAIAAMBKBNlc6tu3b46XFUhyPssWAAAAhY8gCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKBFkAAABYiSALAAAAKxFkAQAAYCWCLAAAAKxEkAUAAICVCLIAAACwEkEWAAAAViLIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAADASgRZAAAAWIkgCwAAACsRZAEAAGAlgiwAAACsRJAFAACAlQiyAAAAsBJBFgAAAFYiyAIAAMBKXu6eAIB7M8ZIki5fvixvb283z6ZgZGRkKD09XZcuXSo2NUnFsy5qskdxrKs41iQVz7ouX74s6f9+ZxUlgizwEDt//rwkqWrVqm6eCQAAOTt//rxCQkKKdEyCLPAQK126tCTp5MmTRf6HQ2G5dOmSKlWqpB9//FHBwcHunk6BKY51UZM9imNdxbEmqXjWdfHiRVWuXNn5O6soEWSBh5iHxy+XsYeEhBSbP/AyBQcHF7uapOJZFzXZozjWVRxrkopnXZm/s4p0zCIfEQAAACgABFkAAABYiSALPMR8fX0VFxcnX19fd0+lwBTHmqTiWRc12aM41lUca5KKZ13urMlh3PGsBAAAAOABcUYWAAAAViLIAgAAwEoEWQAAAFiJIAsUojlz5qhq1ary8/NTw4YNtW3bthzbL168WHXr1lVAQIAqVKigfv36Of91r0wrVqxQrVq15Ovrq1q1amnlypUPPK47a5o/f76eeuoplSpVSqVKlVK7du20Z88elz7GjBkjh8Ph8hMWFlZgNRVGXQkJCVnm7HA4dO3atQca1501tW7dOtuaOnXq5GxT2McqrzV99NFHqlmzpvz9/fX444/r008/zdLG3WsqP/3fr66HYV0VdE0Pw5oqjLrcva7+93//V88995zCw8PlcDi0atWq+77n66+/VsOGDeXn56dq1arp448/ztKmyNaVAVAoEhMTjbe3t5k/f75JSUkxb731lgkMDDQnTpzItv22bduMh4eHmTFjhjl27JjZtm2beeKJJ0yXLl2cbXbu3Gk8PT3N+PHjTWpqqhk/frzx8vIyu3btyve47q6pR48e5qOPPjJJSUkmNTXV9OvXz4SEhJiffvrJ2SYuLs488cQT5tSpU86fs2fPPnA9hVlXfHy8CQ4OdpnzqVOnHmhcd9d0/vx5l1oOHjxoPD09TXx8vLNNYR6rvNY0Z84cExQUZBITE83Ro0fN0qVLTYkSJczq1audbdy9pgqrLnevq8Koyd1rqrDqcve6Wrt2rRk1apRZsWKFkWRWrlyZY/tjx46ZgIAA89Zbb5mUlBQzf/584+3tbZYvX+5sU5TriiALFJLGjRub1157zWVbjRo1zLvvvptt+8mTJ5tq1aq5bJs5c6apWLGi8/WLL75oOnTo4NImOjraxMTE5HvcvCiMmu528+ZNExQUZBYtWuTcFhcXZ+rWrZv/id9HYdQVHx9vQkJCCnTcvCiKYzVt2jQTFBRkrly54txWmMcqrzU1a9bMvPPOOy7b3nrrLdOiRQvna3evqfz0n5u67lbU66owanL3mspP//k5VkW9ru6UmyA7YsQIU6NGDZdtr776qmnatKnzdVGuKy4tAArBjRs3tG/fPrVv395le/v27bVz585s39O8eXP99NNPWrt2rYwxOnPmjJYvX+7y9dI333yTpc/o6Ghnn/kZ19013S09PV0ZGRlZ/s3uH374QeHh4apatapiYmJ07NixB6onU2HWdeXKFVWpUkUVK1bUs88+q6SkpAca92Go6U4LFixQTEyMAgMDXbYXxrHKT03Xr1+Xn5+fyzZ/f3/t2bNHGRkZkty7pvLbf27qultRrqvCrMldayq//efnWBXlusqPe62ZvXv3umVdEWSBQnDu3DndunVLoaGhLttDQ0N1+vTpbN/TvHlzLV68WN27d5ePj4/CwsJUsmRJzZo1y9nm9OnTOfaZn3HdXdPd3n33XT3yyCNq166dc1uTJk306aefav369Zo/f75Onz6t5s2bZ7l++GGqq0aNGkpISNDq1au1dOlS+fn5qUWLFvrhhx/yPa67a7rTnj17dPDgQQ0cONBle2Edq/zUFB0drU8++UT79u2TMUZ79+7VwoULlZGRoXPnzkly75oqzLruVpTrqrBqcueaKsy67lTU6yo/7rVmbt686ZZ1RZAFCpHD4XB5bYzJsi1TSkqKhgwZotGjR2vfvn1at26djh8/rtdeey3PfeZl3LwqjJoyffjhh1q6dKm++uorl7MYv/nNb/TCCy8oKipK7dq105o1ayRJixYtKpCapIKvq2nTpnr55ZdVt25dPfXUU1q2bJmqV6+eJRjaeqwWLFig2rVrq3Hjxi7bC/tY5aWm2NhY/eY3v1HTpk3l7e2tzp07q2/fvpIkT0/PPPVZmMcpr/3ntq5M7lpXBV3Tw7Cm8tp/Xo+Vu9ZVXmX3Gdy9vajWFUEWKARly5aVp6dnlr9Znj17NsvfQDNNmDBBLVq00O9+9zvVqVNH0dHRmjNnjhYuXKhTp05JksLCwnLsMz/jurumTH/60580fvx4bdiwQXXq1MlxLoGBgYqKinKeiXkQhV1XJg8PDz355JPOOdt8rNLT05WYmJjlrFF2CupY5acmf39/LVy4UOnp6UpLS9PJkycVERGhoKAglS1bVpJ711Rh1pXJHeuqsGvKVJRrqijqcse6yo97rRkvLy+VKVMmxzaFsa4IskAh8PHxUcOGDbVx40aX7Rs3blTz5s2zfU96ero8PFyXZObf2DP/ttusWbMsfW7YsMHZZ37Gza3CqkmSJk+erLFjx2rdunVq1KjRfedy/fp1paamqkKFCnktI4vCrOtOxhglJyc752zrsZKkZcuW6fr163r55ZfvO5eCOlYP8nl5e3urYsWK8vT0VGJiop599llnre5cUw/af051Se5bV4VZ052Kck09aP+5qcsd6yo/7rVmGjVqJG9v7xzbFMq6ytOtYQByLfPRIgsWLDApKSlm6NChJjAw0KSlpRljjHn33XdNr169nO3j4+ONl5eXmTNnjjl69KjZvn27adSokWncuLGzzY4dO4ynp6eZOHGiSU1NNRMnTrznI03uNe7DVtOkSZOMj4+PWb58ucujZS5fvuxsM3z4cLN161Zz7Ngxs2vXLvPss8+aoKCgAqmpsOoaM2aMWbdunTl69KhJSkoy/fr1M15eXmb37t25HvdhqylTy5YtTffu3bMdtzCPVV5rOnz4sPnss8/M999/b3bv3m26d+9uSpcubY4fP+5s4+41VVh1uXtdFUZN7l5ThVVXJnetq8uXL5ukpCSTlJRkJJmpU6eapKQk52Ow7q4p8/Fbw4YNMykpKWbBggVZHr9VlOuKIAsUoo8++shUqVLF+Pj4mAYNGpivv/7aua9Pnz6mVatWLu1nzpxpatWqZfz9/U2FChVMz549XZ77aIwxX375pXn88ceNt7e3qVGjhlmxYkWexn3YaqpSpYqRlOUnLi7O2aZ79+6mQoUKxtvb24SHh5uuXbuaQ4cOFVhNhVHX0KFDTeXKlY2Pj48pV66cad++vdm5c2eexn3YajLml1/MksyGDRuyHbOwj1VeakpJSTH16tUz/v7+Jjg42HTu3Nn8/e9/z9Knu9dUYdT1MKyrgq7pYVhThVGXMe5dV1u2bMn2/5U+ffpkW5MxxmzdutXUr1/f+Pj4mIiICDN37tws/RbVunIYc4/vwQAAAICHGNfIAgAAwEoEWQAAAFiJIAsAAAArEWQBAABgJYIsAAAArESQBQAAgJUIsgAAALASQRYAAABWIsgCAArUmDFjVK9ePefrvn37qkuXLg/UZ0H0AaD4IcgCwK9A37595XA45HA45O3trWrVqumdd97R1atXC33sGTNmKCEhIVdt09LS5HA4lJycnO8+APx6eLl7AgCAotGhQwfFx8crIyND27Zt08CBA3X16lXNnTs3S9uMjAx5e3sXyLghISEPRR82KsjjABRHnJEFgF8JX19fhYWFqVKlSurRo4d69uypVatWSfq/ywEWLlyoatWqydfXV8YYXbx4Ua+88orKly+v4OBgtWnTRvv373fpd+LEiQoNDVVQUJAGDBiga9euuey/+7KA27dva9KkSYqMjJSvr68qV66scePGSZKqVq0qSapfv74cDodat26dbR/Xr1/XkCFDVL58efn5+ally5b69ttvnfu3bt0qh8OhzZs3q1GjRgoICFDz5s11+PDhHD+jkSNHqnr16goICFC1atUUGxurjIwMlzarV69Wo0aN5Ofnp7Jly6pr164u8xoxYoQqVaokX19fPfbYY1qwYIEkKSEhQSVLlnTpa9WqVXI4HM7X9zoO69atU8uWLVWyZEmVKVNGzz77rI4ePerS108//aSYmBiVLl1agYGBatSokXbv3q20tDR5eHho7969Lu1nzZqlKlWqyBiT42cCPMwIsgDwK+Xv7+8S0o4cOaJly5ZpxYoVzq/2O3XqpNOnT2vt2rXat2+fGjRooLZt2+rChQuSpGXLlikuLk7jxo3T3r17VaFCBc2ZMyfHcX//+99r0qRJio2NVUpKipYsWaLQ0FBJ0p49eyRJmzZt0qlTp/TVV19l28eIESO0YsUKLVq0SN99950iIyMVHR3tnFemUaNGacqUKdq7d6+8vLzUv3//HOcWFBSkhIQEpaSkaMaMGZo/f76mTZvm3L9mzRp17dpVnTp1UlJSkjMoZ+rdu7cSExM1c+ZMpaam6uOPP1aJEiVyHPNu2R2Hq1ev6u2339a3336rzZs3y8PDQ88//7xu374tSbpy5YpatWqln3/+WatXr9b+/fs1YsQI3b59WxEREWrXrp3i4+NdxomPj3decgJYywAAir0+ffqYzp07O1/v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",
      "text/plain": [
       "<Figure size 700x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 3))\n",
    "\n",
    "ax.errorbar(acc_test, 0, xerr=ci_length, fmt=\"o\")\n",
    "\n",
    "ax.set_xlim([0.8, 1.0])\n",
    "\n",
    "ax.set_yticks(np.arange(1))\n",
    "ax.set_yticklabels([\"Normal approximation interval\"])\n",
    "ax.set_xlabel(\"Prediction accuracy\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.grid(axis=\"x\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Lastly, let's store our confidence interval in a Python dictionary so that we can retrieve it later when we compare it to other confidence intervals:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "results = {\n",
    "    \"Method 1: Normal approximation\": {\n",
    "        \"Test accuracy\": acc_test,\n",
    "        \"Lower 95% CI\": ci_lower,\n",
    "        \"Upper 95% CI\": ci_upper,\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2) Bootstrapping Training Sets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9553670076911844"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "rng = np.random.RandomState(seed=12345)\n",
    "idx = np.arange(y_train.shape[0])\n",
    "\n",
    "bootstrap_train_accuracies = []\n",
    "bootstrap_rounds = 200\n",
    "\n",
    "\n",
    "for i in range(bootstrap_rounds):\n",
    "\n",
    "    train_idx = rng.choice(idx, size=idx.shape[0], replace=True)\n",
    "    valid_idx = np.setdiff1d(idx, train_idx, assume_unique=False)\n",
    "\n",
    "    boot_train_X, boot_train_y = X_train[train_idx], y_train[train_idx]\n",
    "    boot_valid_X, boot_valid_y = X_train[valid_idx], y_train[valid_idx]\n",
    "\n",
    "    clf.fit(boot_train_X, boot_train_y)\n",
    "    acc = clf.score(boot_valid_X, boot_valid_y)\n",
    "    bootstrap_train_accuracies.append(acc)\n",
    "\n",
    "bootstrap_train_mean = np.mean(bootstrap_train_accuracies)\n",
    "bootstrap_train_mean"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- We can visualize the test accuracies from bootstrapping ($ \\text{ACC}_{\\text{boot}, j}$) along with their sample mean ($\\text{ACC}_{\\text{bootavg}}$) in a historgram:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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R0dr8uTJdpYNAGhF/rAn8Nvs/abx+M8HpZLqptcNJlN34t+3P5McEaHfvySN72fPfgG0LbaGii+//FK33HKLvv32W5177rm64oor9OGHH6pXr16SpFmzZunYsWPKyMhQeXm5hg0bpry8PMXExNhZNgAAAICT2Boq1qxZc9rlDodDbrdbbrc7NAUBAAAACFiruqYCAAAAQPghVAAAAACwhFABAAAAwBJCBQAAAABLCBUAAAAALCFUAAAAALCkWaGiT58+Kisr85s/fPiw+vTpY7koAAAAAOGjWaHiwIEDqqur85uvrq7WV199ZbkoAAAAAOEjoA+/W7dune//f/rTn9S5c2ffuK6uThs3blTv3r1brDgAAAAArV9AoeLGG2+UdOKTrtPT0xstczqd6t27t5566qkWKw4AAABA6xdQqKivr5ckJSUlqbCwUD169AhKUQAAAADCR0ChosH+/ftbug4AAAAAYapZoUKSNm7cqI0bN6q0tNR3BqPB8uXLLRcGAAAAIDw0K1TMnTtX8+bN09ChQxUfHy+Hw9HSdQEAAAAIE80KFc8995xeeOEF3XbbbS1dDwAAAIAw06zPqaipqdGIESNauhYAAAAAYahZoWLKlClatWpVS9cCAAAAIAw16+VPx48f15IlS/TOO+9o8ODBcjqdjZbn5OS0SHEAAAAAWr9mhYq//vWvuvTSSyVJf/vb3xot46JtAAAA4OzSrFCxadOmlq4DAAAAQJhq1jUVAAAAANCgWWcqRo8efdqXOb377rvNLggAAABAeGlWqGi4nqKB1+tVUVGR/va3vyk9Pb0l6gIAAAAQJpoVKn772982Oe92u3X06FFLBQEAAAAILy16TcWtt96q5cuXt+QmAQAAALRyLRoqtmzZog4dOrTkJgEAAAC0cs16+dPEiRMbjY0xOnTokLZu3aqHH364RQoDAAAAEB6aFSo6d+7caNyuXTv169dP8+bNU1paWosUBgAAACA8NCtUrFixoqXrUHZ2th588EHdf//9ys3NlXTiDMjcuXO1ZMkSlZeXa9iwYVq0aJEuueSSFt8/AMDfH/bYXQEAIBxYuqZi27Zteumll/Tyyy9r+/btzd5OYWGhlixZosGDBzeaX7BggXJycrRw4UIVFhYqLi5OqampqqystFI2AAAAgBbUrFBRWlqqq6++Wpdffrnuu+8+TZ8+XUOGDNE111yjf/zjHwFt6+jRo/r5z3+upUuXqmvXrr55Y4xyc3M1Z84cTZw4UQMHDtTKlStVVVWlVatWNadsAAAAAEHQrJc/3XvvvaqoqNDOnTvVv39/SdKuXbuUnp6u++67T6tXrz7jbU2bNk3jxo3TmDFj9Nhjj/nm9+/fr5KSkkbXaLhcLqWkpKigoEBTp05tcnvV1dWqrq72jSsqKiSd+IA+r9cb0HHi7NXQK/QMzlRb7RlTZ3cFwWHqav3Gpi70P7uGfdqx7wZtrGXbvLZ6X4PgCVWvNCtUbNiwQe+8844vUEjSgAEDtGjRooAu1F6zZo3+8pe/qLCw0G9ZSUmJJCk2NrbRfGxsrIqLi0+5zezsbM2dO9dvftOmTYqOjj7j2gBJ8ng8dpeAMEPPhAdTIZ38EGi+3PKvOZvs88jYtOv1n9m0Y1jCfQ3OVFVVVUj206xQUV9fL6fT6TfvdDpVX19/Rtv44osvdP/99ysvL++0n23hcDgajY0xfnMnmz17tjIzM33jiooKJSYmavTo0erevfsZ1QZ4vV55PB6lpqY22evA97XVnnm7jT7hdHxTLu389x+0HOcPlyO262luERymzivt80h9UuWIsKdvxibbsls0U1u9r0HwlJWVhWQ/zQoVV199te6//36tXr1aCQkJkqSvvvpKM2fO1DXXXHNG29i2bZtKS0s1ZMgQ31xdXZ02b96shQsXas+eE285UlJSovj4eN86paWlfmcvTuZyueRyufzmnU4nv3wIGH2DQLW1nnFE2F1BcDgiIv3Gdj2pN5IcEU7b9t+G2vWs0tbuaxA8oeqTZl2ovXDhQlVWVqp3797q27evLrzwQiUlJamyslLPPPPMGW3jmmuu0Y4dO1RUVOT7Gjp0qH7+85+rqKhIffr0UVxcXKPTezU1NcrPz9eIESOaUzYAAACAIGjWmYrExET95S9/kcfj0d///ncZYzRgwACNGTPmjLcRExOjgQMHNpo755xz1L17d9/8jBkzlJWVpeTkZCUnJysrK0vR0dGaPHlyc8oGAAAAEAQBhYp3331X06dP14cffqhOnTopNTVVqampkqQjR47okksu0XPPPaerrrqqRYqbNWuWjh07poyMDN+H3+Xl5SkmJqZFtg8AAADAuoBCRW5uru6++2516tTJb1nnzp01depU5eTkNDtUvPfee43GDodDbrdbbre7WdsDAAAAEHwBXVPxySef6Lrrrjvl8rS0NG3bts1yUQAAAADCR0Ch4ptvvjntFeSRkZEBf6I2AAAAgPAWUKg477zztGPHjlMu/+tf/9ro7V8BAAAAtH0BhYrrr79ev/nNb3T8+HG/ZceOHdMjjzyiG264ocWKAwAAAND6BXSh9kMPPaQ33nhDF110kaZPn65+/frJ4XBo9+7dWrRokerq6jRnzpxg1QoAAACgFQooVMTGxqqgoEC/+MUvNHv2bBljJJ14l6Zrr71Wzz777Gk/7RoAAABA2xPwh9/16tVL69evV3l5uT7//HMZY5ScnKyuXbsGoz4AAAAArVyzPlFbkrp27arLL7+8JWsBAAAAEIYCulAbAAAAAL6PUAEAAADAEkIFAAAAAEsIFQAAAAAsIVQAAAAAsIRQAQAAAMASQgUAAAAASwgVAAAAACwhVAAAAACwhFABAAAAwBJCBQAAAABLCBUAAAAALCFUAAAAALCEUAEAAADAEkIFAAAAAEsIFQAAAAAsIVQAAAAAsIRQAQAAAMASQgUAAAAASwgVAAAAACyxNVQsXrxYgwcPVqdOndSpUycNHz5cb7/9tm+5MUZut1sJCQmKiorSqFGjtHPnThsrBgAAAPB9toaK888/X48//ri2bt2qrVu36uqrr9aECRN8wWHBggXKycnRwoULVVhYqLi4OKWmpqqystLOsgEAAACcxNZQMX78eF1//fW66KKLdNFFF2n+/Pnq2LGjPvzwQxljlJubqzlz5mjixIkaOHCgVq5cqaqqKq1atcrOsgEAAACcJNLuAhrU1dXp1Vdf1Xfffafhw4dr//79KikpUVpamm8dl8ullJQUFRQUaOrUqU1up7q6WtXV1b5xRUWFJMnr9crr9Qb3INBmNPQKPYMz1VZ7xtTZXUFwmLpav7GpC/3PrmGfduy7QRtr2Tavrd7XIHhC1Su2h4odO3Zo+PDhOn78uDp27Ki1a9dqwIABKigokCTFxsY2Wj82NlbFxcWn3F52drbmzp3rN79p0yZFR0e3bPFo8zwej90lIMzQM+HBVEgnPwSaL7f8a84m+zwyNu16/Wc27RiWcF+DM1VVVRWS/dgeKvr166eioiIdPnxYr7/+utLT05Wfn+9b7nA4Gq1vjPGbO9ns2bOVmZnpG1dUVCgxMVGjR49W9+7dW/4A0CZ5vV55PB6lpqbK6XTaXQ7CQFvtmbfb6BNOxzfl0s7Cf4/PHy5HbNeQ12HqvNI+j9QnVY4Ie/pmbLItu0UztdX7GgRPWVlZSPZje6ho3769LrzwQknS0KFDVVhYqP/93//Vr3/9a0lSSUmJ4uPjfeuXlpb6nb04mcvlksvl8pt3Op388iFg9A0C1dZ6xhFhdwXB4YiI9Bvb9aTeSHJEOG3bfxtq17NKW7uvQfCEqk9a3edUGGNUXV2tpKQkxcXFNTq9V1NTo/z8fI0YMcLGCgEAAACczNYzFQ8++KDGjh2rxMREVVZWas2aNXrvvfe0YcMGORwOzZgxQ1lZWUpOTlZycrKysrIUHR2tyZMn21k2AAAAgJPYGiq++eYb3XbbbTp06JA6d+6swYMHa8OGDUpNTZUkzZo1S8eOHVNGRobKy8s1bNgw5eXlKSYmxs6yAQAAAJzE1lCxbNmy0y53OBxyu91yu92hKQgAAABAwFrdNRUAAAAAwguhAgAAAIAlhAoAAAAAlhAqAAAAAFhCqAAAAABgCaECAAAAgCWECgAAAACWECoAAAAAWEKoAAAAAGAJoQIAAACAJYQKAAAAAJYQKgAAAABYEml3AQBwNvvDHrsrAADAOs5UAAAAALCEUAEAAADAEkIFAAAAAEsIFQAAAAAsIVQAAAAAsIRQAQAAAMASQgUAAAAASwgVAAAAACwhVAAAAACwhFABAAAAwBJCBQAAAABLCBUAAAAALCFUAAAAALCEUAEAAADAEltDRXZ2ti6//HLFxMSoZ8+euvHGG7Vnz55G6xhj5Ha7lZCQoKioKI0aNUo7d+60qWIAAAAA32drqMjPz9e0adP04YcfyuPxqLa2Vmlpafruu+986yxYsEA5OTlauHChCgsLFRcXp9TUVFVWVtpYOQAAAIAGkXbufMOGDY3GK1asUM+ePbVt2zb9x3/8h4wxys3N1Zw5czRx4kRJ0sqVKxUbG6tVq1Zp6tSpdpQNAAAA4CSt6pqKI0eOSJK6desmSdq/f79KSkqUlpbmW8flciklJUUFBQW21AgAAACgMVvPVJzMGKPMzEyNHDlSAwcOlCSVlJRIkmJjYxutGxsbq+Li4ia3U11drerqat+4oqJCkuT1euX1eoNROtqghl6hZ3Cmmtszpi4Y1eCHmLpav7GpC/3ve8M+7dh3A+7mwguPTwhUqHql1YSK6dOn669//as++OADv2UOh6PR2BjjN9cgOztbc+fO9ZvftGmToqOjW6ZYnDU8Ho/dJSDM0DPhwVRIJz8Emi+3/GvOJvs8Mjbtev1nNu0YlnBfgzNVVVUVkv20ilBx7733at26ddq8ebPOP/9833xcXJykE2cs4uPjffOlpaV+Zy8azJ49W5mZmb5xRUWFEhMTNXr0aHXv3j1IR4C2xuv1yuPxKDU1VU6n0+5yEAaa2zNv84TOFo5vyqWdhf8enz9cjtiuIa/D1HmlfR6pT6ocEfbc14xNtmW3aCYenxCosrKykOzH1lBhjNG9996rtWvX6r333lNSUlKj5UlJSYqLi5PH49Fll10mSaqpqVF+fr6eeOKJJrfpcrnkcrn85p1OJ798CBh9g0AF2jOOiCAWg1NyRET6je16Um8kOSKctu2fu7jwxOMTzlSo+sTWUDFt2jStWrVK//d//6eYmBjfNRSdO3dWVFSUHA6HZsyYoaysLCUnJys5OVlZWVmKjo7W5MmT7SwdAAAAwL/YGioWL14sSRo1alSj+RUrVuiOO+6QJM2aNUvHjh1TRkaGysvLNWzYMOXl5SkmJibE1QIAAABoiu0vf/ohDodDbrdbbrc7+AUBAAAACFir+pwKAAAAAOGHUAEAAADAEkIFAAAAAEsIFQAAAAAsIVQAAAAAsIRQAQAAAMASW99SFgAA2OsPe+yu4IeN72d3BQB+CGcqAAAAAFhCqAAAAABgCaECAAAAgCWECgAAAACWECoAAAAAWEKoAAAAAGAJoQIAAACAJYQKAAAAAJYQKgAAAABYQqgAAAAAYAmhAgAAAIAlhAoAAAAAlhAqAAAAAFhCqAAAAABgCaECAAAAgCWECgAAAACWECoAAAAAWEKoAAAAAGBJpN0FAEAw/WFPaPZj6k78+/ZnkiMiNPsEAKC14EwFAAAAAEsIFQAAAAAssTVUbN68WePHj1dCQoIcDofefPPNRsuNMXK73UpISFBUVJRGjRqlnTt32lMsAAAAgCbZGiq+++47/ehHP9LChQubXL5gwQLl5ORo4cKFKiwsVFxcnFJTU1VZWRniSgEAAACciq0Xao8dO1Zjx45tcpkxRrm5uZozZ44mTpwoSVq5cqViY2O1atUqTZ06NZSlAgAAADiFVntNxf79+1VSUqK0tDTfnMvlUkpKigoKCmysDAAAAMDJWu1bypaUlEiSYmNjG83HxsaquLj4lLerrq5WdXW1b1xRUSFJ8nq98nq9QagUbVFDr9Az4a/hrV6Dvx9vo3/Rupm6Wr+xHT87+ubMcFf8bzw+IVCh6pVWGyoaOByORmNjjN/cybKzszV37ly/+U2bNik6OrrF60Pb5vF47C4B4WafR8buGvCDTIV08kOg+XLLv+ZsQt+c1vrP7K6g9eHxCWeqqqoqJPtptaEiLi5O0okzFvHx8b750tJSv7MXJ5s9e7YyMzN944qKCiUmJmr06NHq3r178ApGm+L1euXxeJSamiqn02l3ObDg7RA9GTF1XmmfR+qTKkcEPdPaOb4pl3YW/nt8/nA5YruGvA765syMTba7gtaDxycEqqysLCT7abWhIikpSXFxcfJ4PLrsssskSTU1NcrPz9cTTzxxytu5XC65XC6/eafTyS8fAkbfhL9Qfrq1keSIcPLkMAw4IiL9xnb93OibH8bdsD8en3CmQtUntoaKo0eP6vPPP/eN9+/fr6KiInXr1k0XXHCBZsyYoaysLCUnJys5OVlZWVmKjo7W5MmTbawaAAAAwMlsDRVbt27V6NGjfeOGly2lp6frhRde0KxZs3Ts2DFlZGSovLxcw4YNU15enmJiYuwqGQAAAMD32BoqRo0aJWNOfWmaw+GQ2+2W2+0OXVEAAAAAAtJqP6cCAAAAQHggVAAAAACwhFABAAAAwBJCBQAAAABLCBUAAAAALGm1H34HAAAgSX/YY3cFpze+n90VAPbjTAUAAAAASwgVAAAAACwhVAAAAACwhFABAAAAwBJCBQAAAABLCBUAAAAALCFUAAAAALCEUAEAAADAEkIFAAAAAEsIFQAAAAAsIVQAAAAAsIRQAQAAAMASQgUAAAAASwgVAAAAACwhVAAAAACwhFABAAAAwBJCBQAAAABLCBUAAAAALCFUAAAAALCEUAEAAADAEkIFAAAAAEsIFQAAAAAsCYtQ8eyzzyopKUkdOnTQkCFD9P7779tdEgAAAIB/afWh4ve//71mzJihOXPmaPv27brqqqs0duxYHTx40O7SAAAAACgMQkVOTo7uuusuTZkyRf3791dubq4SExO1ePFiu0sDAAAAoFYeKmpqarRt2zalpaU1mk9LS1NBQYFNVQEAAAA4WaTdBZzOt99+q7q6OsXGxjaaj42NVUlJSZO3qa6uVnV1tW985MgRSdI///nP4BWKNsfr9aqqqkplZWVyOp12lwMLvjsSmv2YOq9UVSUdKZMjgp5p7Y5VHFZ9ddVJ43J918GEvA76pm0oKwvdvnh8QqAangMbE9z7uFYdKho4HI5GY2OM31yD7OxszZ0712/+oosuCkptAIDw92Cu3RUAQHCVlZWpc+fOQdt+qw4VPXr0UEREhN9ZidLSUr+zFw1mz56tzMxM3/jw4cPq1auXDh48GNRvJNqWiooKJSYm6osvvlCnTp3sLgdhgJ5Bc9A3CBQ9g0AdOXJEF1xwgbp16xbU/bTqUNG+fXsNGTJEHo9HP/nJT3zzHo9HEyZMaPI2LpdLLpfLb75z58788iFgnTp1om8QEHoGzUHfIFD0DALVrl1wL6Vu1aFCkjIzM3Xbbbdp6NChGj58uJYsWaKDBw/qnnvusbs0AAAAAAqDUHHzzTerrKxM8+bN06FDhzRw4ECtX79evXr1srs0AAAAAAqDUCFJGRkZysjIaNZtXS6XHnnkkSZfEgWcCn2DQNEzaA76BoGiZxCoUPWMwwT7/aUAAAAAtGmt+sPvAAAAALR+hAoAAAAAlhAqAAAAAFgSdqHi2WefVVJSkjp06KAhQ4bo/fffP+36ixYtUv/+/RUVFaV+/frpxRdf9Fvn9ddf14ABA+RyuTRgwACtXbs2WOXDJi3dN0uXLtVVV12lrl27qmvXrhozZow+/vjjYB4CQiwY9zUN1qxZI4fDoRtvvLGFq4bdgtE3hw8f1rRp0xQfH68OHTqof//+Wr9+fbAOASEWjJ7Jzc1Vv379FBUVpcTERM2cOVPHjx8P1iEgxDZv3qzx48crISFBDodDb7755g/eJj8/X0OGDFGHDh3Up08fPffcc37rWH4+bMLImjVrjNPpNEuXLjW7du0y999/vznnnHNMcXFxk+s/++yzJiYmxqxZs8bs3bvXrF692nTs2NGsW7fOt05BQYGJiIgwWVlZZvfu3SYrK8tERkaaDz/8MFSHhSALRt9MnjzZLFq0yGzfvt3s3r3b/Pd//7fp3Lmz+fLLL0N1WAiiYPRMgwMHDpjzzjvPXHXVVWbChAlBPhKEUjD6prq62gwdOtRcf/315oMPPjAHDhww77//vikqKgrVYSGIgtEzL730knG5XObll182+/fvN3/6059MfHy8mTFjRqgOC0G2fv16M2fOHPP6668bSWbt2rWnXX/fvn0mOjra3H///WbXrl1m6dKlxul0mtdee823Tks8Hw6rUPH//t//M/fcc0+juYsvvtg88MADTa4/fPhw88tf/rLR3P3332+uvPJK3/imm24y1113XaN1rr32WjNp0qQWqhp2C0bffF9tba2JiYkxK1eutF4wbBesnqmtrTVXXnmlef755016ejqhoo0JRt8sXrzY9OnTx9TU1LR8wbBdMHpm2rRp5uqrr260TmZmphk5cmQLVY3W5ExCxaxZs8zFF1/caG7q1Knmiiuu8I1b4vlw2Lz8qaamRtu2bVNaWlqj+bS0NBUUFDR5m+rqanXo0KHRXFRUlD7++GN5vV5J0pYtW/y2ee21155ymwgvweqb76uqqpLX61W3bt1apnDYJpg9M2/ePJ177rm66667Wr5w2CpYfbNu3ToNHz5c06ZNU2xsrAYOHKisrCzV1dUF50AQMsHqmZEjR2rbtm2+l+Tu27dP69ev17hx44JwFAgHp3quu3Xr1hZ9Phw2oeLbb79VXV2dYmNjG83HxsaqpKSkydtce+21ev7557Vt2zYZY7R161YtX75cXq9X3377rSSppKQkoG0ivASrb77vgQce0HnnnacxY8a0+DEgtILVM3/+85+1bNkyLV26NOjHgNALVt/s27dPr732murq6rR+/Xo99NBDeuqppzR//vygHxOCK1g9M2nSJD366KMaOXKknE6n+vbtq9GjR+uBBx4I+jGhdTrVc93a2toWfT4cNqGigcPhaDQ2xvjNNXj44Yc1duxYXXHFFXI6nZowYYLuuOMOSVJERESztonwFIy+abBgwQKtXr1ab7zxht9fkBC+WrJnKisrdeutt2rp0qXq0aNHsEuHjVr6vqa+vl49e/bUkiVLNGTIEE2aNElz5szR4sWLg3ocCJ2W7pn33ntP8+fP17PPPqu//OUveuONN/TWW2/p0UcfDepxoHVrqs++P2/1+XDYhIoePXooIiLCLzGVlpb6JasGUVFRWr58uaqqqnTgwAEdPHhQvXv3VkxMjO+BPS4uLqBtIrwEq28a/M///I+ysrKUl5enwYMHB+04EDrB6Jm9e/fqwIEDGj9+vCIjIxUZGakXX3xR69atU2RkpPbu3RuKQ0MQBeu+Jj4+XhdddFGjP2j0799fJSUlqqmpCd4BIeiC1TMPP/ywbrvtNk2ZMkWDBg3ST37yE2VlZSk7O1v19fVBPy60Pqd6rhsZGanu3bufdp1Ang+HTaho3769hgwZIo/H02je4/FoxIgRp72t0+nU+eefr4iICK1Zs0Y33HCD2rU7cejDhw/322ZeXt4PbhPhIVh9I0lPPvmkHn30UW3YsEFDhw4NSv0IvWD0zMUXX6wdO3aoqKjI9/Wf//mfGj16tIqKipSYmBjMQ0IIBOu+5sorr9Tnn3/e6Mngp59+qvj4eLVv377lDwQhE6yeqaqqavRYJZ04i2FOvDlPyx4EwsKpnusOHTpUTqfztOsE9Hz4jC/pbgUa3npt2bJlZteuXWbGjBnmnHPOMQcOHDDGGPPAAw+Y2267zbf+nj17zO9+9zvz6aefmo8++sjcfPPNplu3bmb//v2+df785z+biIgI8/jjj5vdu3ebxx9/nLeUbWOC0TdPPPGEad++vXnttdfMoUOHfF+VlZWhPjwEQTB65vt496e2Jxh9c/DgQdOxY0czffp0s2fPHvPWW2+Znj17msceeyzUh4cgCEbPPPLIIyYmJsasXr3a7Nu3z+Tl5Zm+ffuam266KdSHhyCprKw027dvN9u3bzeSTE5Ojtm+fbvvrYi/3zcNbyk7c+ZMs2vXLrNs2TK/t5RtiefDYRUqjDFm0aJFplevXqZ9+/bmxz/+scnPz/ctS09PNykpKb7xrl27zKWXXmqioqJMp06dzIQJE8zf//53v22++uqrpl+/fsbpdJqLL77YvP7666E4FIRQS/dNr169jCS/r0ceeSRER4RgC8Z9zckIFW1TMPqmoKDADBs2zLhcLtOnTx8zf/58U1tbG4rDQQi0dM94vV7jdrtN3759TYcOHUxiYqLJyMgw5eXlIToiBNumTZuafA6Snp5ujPHvG2OMee+998xll11m2rdvb3r37m0WL17st12rz4cdxnAuDAAAAEDzhc01FQAAAABaJ0IFAAAAAEsIFQAAAAAsIVQAAAAAsIRQAQAAAMASQgUAAAAASwgVAAAAACwhVAAAAACwhFABAAAAwBJCBQCcZQoKChQREaHrrrvO7lIAAG2Ewxhj7C4CABA6U6ZMUceOHfX8889r165duuCCC2ypw+v1yul02rJvAEDL4kwFAJxFvvvuO73yyiv6xS9+oRtuuEEvvPBCo+Xr1q3T0KFD1aFDB/Xo0UMTJ070LauurtasWbOUmJgol8ul5ORkLVu2TJL0wgsvqEuXLo229eabb8rhcPjGbrdbl156qZYvX64+ffrI5XLJGKMNGzZo5MiR6tKli7p3764bbrhBe/fubbStL7/8UpMmTVK3bt10zjnnaOjQofroo4904MABtWvXTlu3bm20/jPPPKNevXqJv5sBQGgQKgDgLPL73/9e/fr1U79+/XTrrbdqxYoVvifef/zjHzVx4kSNGzdO27dv18aNGzV06FDfbW+//XatWbNGTz/9tHbv3q3nnntOHTt2DGj/n3/+uV555RW9/vrrKioqknQi6GRmZqqwsFAbN25Uu3bt9JOf/ET19fWSpKNHjyolJUVff/211q1bp08++USzZs1SfX29evfurTFjxmjFihWN9rNixQrdcccdjUINACB4Iu0uAAAQOsuWLdOtt94qSbruuut09OhRbdy4UWPGjNH8+fM1adIkzZ0717f+j370I0nSp59+qldeeUUej0djxoyRJPXp0yfg/dfU1Oh3v/udzj33XN/cf/3Xf/nV2LNnT+3atUsDBw7UqlWr9I9//EOFhYXq1q2bJOnCCy/0rT9lyhTdc889ysnJkcvl0ieffKKioiK98cYbAdcHAGgezlQAwFliz549+vjjjzVp0iRJUmRkpG6++WYtX75cklRUVKRrrrmmydsWFRUpIiJCKSkplmro1atXo0AhSXv37tXkyZPVp08fderUSUlJSZKkgwcP+vZ92WWX+QLF9914442KjIzU2rVrJUnLly/X6NGj1bt3b0u1AgDOHGcqAOAssWzZMtXW1uq8887zzRlj5HQ6VV5erqioqFPe9nTLJKldu3Z+1y94vV6/9c455xy/ufHjxysxMVFLly5VQkKC6uvrNXDgQNXU1JzRvtu3b6/bbrtNK1as0MSJE7Vq1Srl5uae9jYAgJbFmQoAOAvU1tbqxRdf1FNPPaWioiLf1yeffKJevXrp5Zdf1uDBg7Vx48Ymbz9o0CDV19crPz+/yeXnnnuuKisr9d133/nmGq6ZOJ2ysjLt3r1bDz30kK655hr1799f5eXljdYZPHiwioqK9M9//vOU25kyZYreeecdPfvss/J6vY0uMAcABB9nKgDgLPDWW2+pvLxcd911lzp37txo2U9/+lMtW7ZMv/3tb3XNNdeob9++mjRpkmpra/X2229r1qxZ6t27t9LT03XnnXfq6aef1o9+9CMVFxertLRUN910k4YNG6bo6Gg9+OCDuvfee/Xxxx/7vbNUU7p27aru3btryZIlio+P18GDB/XAAw80WueWW25RVlaWbrzxRmVnZys+Pl7bt29XQkKChg8fLknq37+/rrjiCv3617/WnXfe+YNnNwAALYszFQBwFli2bJnGjBnjFyikExdKFxUVqVOnTnr11Ve1bt06XXrppbr66qv10Ucf+dZbvHixfvrTnyojI0MXX3yx7r77bt+ZiW7duumll17S+vXrNWjQIK1evVput/sH62rXrp3WrFmjbdu2aeDAgZo5c6aefPLJRuu0b99eeXl56tmzp66//noNGjRIjz/+uCIiIhqtd9ddd6mmpkZ33nlnM75DAAAr+PA7AECbMH/+fK1Zs0Y7duywuxQAOOtwpgIAENaOHj2qwsJCPfPMM7rvvvvsLgcAzkqECgBAWJs+fbpGjhyplJQUXvoEADbh5U8AAAAALOFMBQAAAABLCBUAAAAALCFUAAAAALCEUAEAAADAEkIFAAAAAEsIFQAAAAAsIVQAAAAAsIRQAQAAAMASQgUAAAAAS/4/H1m7EQGOI/AAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(8, 4))\n",
    "\n",
    "ax.vlines(bootstrap_train_mean, [0], 80, lw=2.5, linestyle=\"-\", label=\"Mean\")\n",
    "\n",
    "ax.hist(\n",
    "    bootstrap_train_accuracies, bins=7, color=\"#0080ff\", edgecolor=\"none\", alpha=0.3\n",
    ")\n",
    "plt.legend(loc=\"upper left\")\n",
    "\n",
    "plt.xlim([0.9, 1.0])\n",
    "\n",
    "plt.xlabel('Accuracy')\n",
    "plt.ylabel('Count')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Using the Percentile Method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9403296497471437 0.970772977022977\n"
     ]
    }
   ],
   "source": [
    "ci_lower = np.percentile(bootstrap_train_accuracies, 2.5)\n",
    "ci_upper = np.percentile(bootstrap_train_accuracies, 97.5)\n",
    "\n",
    "print(ci_lower, ci_upper)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Let's have a look how it looks like in the context of our "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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6YUXXlBsbKxefPFFjRgxQrt371b79u3d61111VVavny5e9y0aVP33//+979r5cqVWr9+vb766iv9/ve/V2JioiIiInT06FHNnDlTGzZs+MVaysvLNXLkSH3++eeaM2eOBg0apPDwcG3dulV/+ctf1KdPH/Xu3btejx8AAAANC6EiwJSWlur111/X//3f/+mKK66QJDmdTr311ltatGiRHnnkEfe6DodD0dHRtW5nz549Gjp0qPr166d+/fopNTVV+/fvV0REhKZNm6aUlBR17NjxF+vJyMjQli1btG3bNvXp08c936VLF11//fUqLy83ecQAAABo6Lj8KcBUVFSosrJSzZo185gPCQnRRx995DG3adMmRUZGqlu3brrjjjuUn5/vXnbxxRdr27ZtKiws1Pbt21VaWqrzzjtPH330kT777DPdc889Z1XPSy+9pBEjRngEimp2u13Nmzevw1ECAAAgkHCm4gyOHD+iIyeOSJJsNpv6RNZ803ys7Jj2Hd3nHp/f5nyF2kM91nFVurTzh53uccfwjmob0rbOdYWFhWnAgAGaM2eOevTooaioKK1atUqffPKJEhIS3OuNGjVK119/vTp16qQDBw7ooYce0pVXXqnt27fL4XBo5MiRuummm3TppZcqJCREK1asUPPmzfWHP/xBzz33nBYtWqSnnnpKbdu21eLFi3XBBRfUWs9XX32loUOH1vl4AAAAEPgIFWfw5tdvatHniyRJ9iZ2fXbzZzXWycnP0ZQPprjHb/z6DSW0TvBY52jZUSWvS3aP5wyao2vPu9ZUbS+88IJuu+02tW/fXkFBQbrkkks0ceJEffbZf2u84YYb3H/v1auX+vXrp06dOumdd97RuHHjJJ26bMrpdLrXczqdGjFihOx2ux555BHt3LlTb7/9tm655RZt37691loMw5DNZjN1PAAAAAhsXP4UgLp27arNmzfr+PHjOnz4sD799FO5XC7Fx8ef8TExMTHq1KmTvvrqq1qXf/HFF3rppZc0Z84cbdq0SVdccYXatWun8ePH67PPPlNRUVGtj+vWrZv27NlTL8cFAACAwESoCGDNmzdXTEyMCgsL9d5772ns2LFnXLegoECHDx9WTExMjWWGYeh//ud/9MQTT6hFixaqrKx0fxRs9X+rqqpq3e7EiRP1/vvva8eOHTWWVVRU6MSJE3U5NAAAAAQQ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Gjx4sOx2u7p27aphw4Zp+vTpPj8mNExneq9bUVFRr++HAyZUVLPZbB5jwzBqzFV76KGHNGrUKF122WWy2+0aO3asbr31VklSUFBQnbaJwOSLvqk2b948rVq1Sm+88UaNf0FC4KrPnikuLtZNN92kJUuWqG3btr4uHRaq79eaqqoqRUZGavHixerbt68mTJigmTNnatGiRT49DvhPfffMpk2bNHfuXD399NP67LPP9MYbb+jtt9/WnDlzfHocaNhq67Ofzpt9PxwwoaJt27YKCgqqkZjy8/NrJKtqISEhWrZsmUpKSnTw4EEdOnRInTt3VlhYmPsXe3R0tFfbRGDxVd9U+8tf/qK0tDStX79eF110kc+OA/7ji57Zt2+fDh48qDFjxig4OFjBwcF6/vnntWbNGgUHB2vfvn3+ODT4kK9ea2JiYtStWzePf9Do0aOH8vLyVF5e7rsDgs/5qmceeugh3XzzzZo0aZIuvPBCXXfddUpLS1N6erqqqqp8flxoeM70Xjc4OFgRERE/u44374cDJlQ0bdpUffv2VWZmpsd8ZmamBg4c+LOPtdvt6tChg4KCgrR69Wpdc801atLk1KEPGDCgxjbXr1//i9tEYPBV30jS448/rjlz5mjdunXq16+fT+qH//miZ84//3zt3LlTOTk57j+//vWvNWzYMOXk5CguLs6XhwQ/8NVrzaBBg/T11197vBn88ssvFRMTo6ZNm9b/gcBvfNUzJSUlHr+rpFNnMYxTH85TvweBgHCm97r9+vWT3W7/2XW8ej981rd0NwDVH722dOlSY/fu3UZqaqrRvHlz4+DBg4ZhGMb06dONm2++2b3+3r17jRdeeMH48ssvjU8++cS44YYbjDZt2hgHDhxwr/OPf/zDCAoKMh599FFjz549xqOPPspHyjYyvuibxx57zGjatKnx2muvGUeOHHH/KS4u9vfhwQd80TM/xac/NT6+6JtDhw4ZLVq0MKZMmWLs3bvXePvtt43IyEjjkUce8ffhwQd80TMPP/ywERYWZqxatcrYv3+/sX79eqNr167G+PHj/X148JHi4mJjx44dxo4dOwxJxvz5840dO3a4P4r4p31T/ZGy9913n7F7925j6dKlNT5Stj7eDwdUqDAMw1i4cKHRqVMno2nTpsYll1xibN682b0sOTnZGDJkiHu8e/duo3fv3kZISIgRHh5ujB071vjiiy9qbPPVV181unfvbtjtduP88883Xn/9dX8cCvyovvumU6dOhqQafx5++GE/HRF8zRevNacjVDROvuibrKwso3///obD4TC6dOlizJ0716ioqPDH4cAP6rtnXC6X4XQ6ja5duxrNmjUz4uLijJSUFKOwsNBPRwRf27hxY63vQZKTkw3DqNk3hmEYmzZtMvr06WM0bdrU6Ny5s7Fo0aIa2zX7fthmGJwLAwAAAFB3AXNPBQAAAICGiVABAAAAwBRCBQAAAABTCBUAAAAATCFUAAAAADCFUAEAAADAFEIFAAAAAFMIFQAAAABMIVQAAAAAMIVQAQDnmKysLAUFBemqq66yuhQAQCNhMwzDsLoIAID/TJo0SS1atNCzzz6r3bt3q2PHjpbU4XK5ZLfbLdk3AKB+caYCAM4hJ06c0CuvvKI//OEPuuaaa/Tcc895LF+zZo369eunZs2aqW3btho3bpx7WVlZmaZNm6a4uDg5HA4lJCRo6dKlkqTnnntOrVq18tjWW2+9JZvN5h47nU717t1by5YtU5cuXeRwOGQYhtatW6fBgwerVatWioiI0DXXXKN9+/Z5bOubb77RhAkT1KZNGzVv3lz9+vXTJ598ooMHD6pJkybatm2bx/pPPfWUOnXqJP7dDAD8g1ABAOeQl19+Wd27d1f37t110003afny5e433u+8847GjRun0aNHa8eOHdqwYYP69evnfuwtt9yi1atX629/+5v27NmjZ555Ri1atPBq/19//bVeeeUVvf7668rJyZF0KuhMnTpV2dnZ2rBhg5o0aaLrrrtOVVVVkqTjx49ryJAh+u6777RmzRp9/vnnmjZtmqqqqtS5c2eNGDFCy5cv99jP8uXLdeutt3qEGgCA7wRbXQAAwH+WLl2qm266SZJ01VVX6fjx49qwYYNGjBihuXPnasKECZo1a5Z7/YsvvliS9OWXX+qVV15RZmamRowYIUnq0qWL1/svLy/XCy+8oHbt2rnnfvOb39SoMTIyUrt371avXr20cuVK/fvf/1Z2drbatGkjSTrvvPPc60+aNEl33nmn5s+fL4fDoc8//1w5OTl64403vK4PAFA3nKkAgHPE3r179emnn2rChAmSpODgYN1www1atmyZJCknJ0fDhw+v9bE5OTkKCgrSkCFDTNXQqVMnj0AhSfv27dPEiRPVpUsXhYeHKz4+XpJ06NAh97779OnjDhQ/de211yo4OFhvvvmmJGnZsmUaNmyYOnfubKpWAMDZ40wFAJwjli5dqoqKCrVv3949ZxiG7Ha7CgsLFRIScsbH/twySWrSpEmN+xdcLleN9Zo3b15jbsyYMYqLi9OSJUsUGxurqqoq9erVS+Xl5We176ZNm+rmm2/W8uXLNW7cOK1cuVIZGRk/+xgAQP3iTAUAnAMqKir0/PPP64knnlBOTo77z+eff65OnTrppZde0kUXXaQNGzbU+vgLL7xQVVVV2rx5c63L27Vrp+LiYp04ccI9V33PxM8pKCjQnj179OCDD2r48OHq0aOHCgsLPda56KKLlJOTox9//PGM25k0aZLef/99Pf3003K5XB43mAMAfI8zFQBwDnj77bdVWFio22+/XS1btvRY9tvf/lZLly7Vk08+qeHDh6tr166aMGGCKioq9O6772ratGnq3LmzkpOTddttt+lvf/ubLr74YuXm5io/P1/jx49X//79FRoaqgceeEB33323Pv300xqfLFWb1q1bKyIiQosXL1ZMTIwOHTqk6dOne6xz4403Ki0tTddee63S09MVExOjHTt2KDY2VgMGDJAk9ejRQ5dddpn+9Kc/6bbbbvvFsxsAgPrFmQoAOAcsXbpUI0aMqBEopFM3Sufk5Cg8PFyvvvqq1qxZo969e+vKK6/UJ5984l5v0aJF+u1vf6uUlBSdf/75uuOOO9xnJtq0aaMXX3xRa9eu1YUXXqhVq1bJ6XT+Yl1NmjTR6tWrtX37dvXq1Uv33XefHn/8cY91mjZtqvXr1ysyMlJXX321LrzwQj366KMKCgryWO/2229XeXm5brvttjr8HwIAmMGX3wEAGoW5c+dq9erV2rlzp9WlAMA5hzMVAICAdvz4cWVnZ+upp57SPffcY3U5AHBOIlQAAALalClTNHjwYA0ZMoRLnwDAIlz+BAAAAMAUzlQAAAAAMIVQAQAAAMAUQgUAAAAAUwgVAAAAAEwhVAAAAAAwhVABAAAAwBRCBQAAAABTCBUAAAAATCFUAAAAADDl/wPyJ3PwPk143QAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(8, 4))\n",
    "ax.vlines(bootstrap_train_mean, [0], 80, lw=2.5, linestyle=\"-\", label=\"Mean\")\n",
    "\n",
    "ax.vlines(ci_lower, [0], 15, lw=2.5, linestyle=\"dotted\", label=\"95% CI\", color=\"C2\")\n",
    "ax.vlines(ci_upper, [0], 15, lw=2.5, linestyle=\"dotted\", color=\"C2\")\n",
    "\n",
    "ax.hist(\n",
    "    bootstrap_train_accuracies, bins=7, color=\"#0080ff\", edgecolor=\"none\", alpha=0.3\n",
    ")\n",
    "plt.legend(loc=\"upper left\")\n",
    "\n",
    "plt.xlim([0.9, 1.0])\n",
    "plt.xlabel('Accuracy')\n",
    "plt.ylabel('Count')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.grid()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "results[\"Method 2: Bootstrap, percentile\"] = {\n",
    "    \"Test accuracy\": bootstrap_train_mean,\n",
    "    \"Lower 95% CI\": ci_lower,\n",
    "    \"Upper 95% CI\": ci_upper,\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3) Bootstrapping the Test Set Predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9785555555555555"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.fit(X_train, y_train)\n",
    "\n",
    "predictions_test = clf.predict(X_test)\n",
    "acc_test = np.mean(predictions_test == y_test)\n",
    "\n",
    "rng = np.random.RandomState(seed=12345)\n",
    "idx = np.arange(y_test.shape[0])\n",
    "\n",
    "test_accuracies = []\n",
    "\n",
    "for i in range(200):\n",
    "\n",
    "    pred_idx = rng.choice(idx, size=idx.shape[0], replace=True)\n",
    "    acc_test_boot = np.mean(predictions_test[pred_idx] == y_test[pred_idx])\n",
    "    test_accuracies.append(acc_test_boot)\n",
    "\n",
    "bootstrap_train_mean = np.mean(test_accuracies)\n",
    "bootstrap_train_mean"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- We can then use the familiar percentile approach to get the confidence interval:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9629629629629629 0.9925925925925926\n"
     ]
    }
   ],
   "source": [
    "ci_lower = np.percentile(test_accuracies, 2.5)\n",
    "ci_upper = np.percentile(test_accuracies, 97.5)\n",
    "\n",
    "print(ci_lower, ci_upper)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "results[\"Method 3: Bootstrap test set\"] = {\n",
    "    \"Test accuracy\": bootstrap_train_mean,\n",
    "    \"Lower 95% CI\": ci_lower,\n",
    "    \"Upper 95% CI\": ci_upper,\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4) Confidence Intervals from Retraining Models with Different Random Seeds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9740740740740741"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_accuracies = []\n",
    "rounds = 5\n",
    "\n",
    "\n",
    "for i in range(rounds):\n",
    "    \n",
    "    clf = MLPClassifier(\n",
    "        hidden_layer_sizes=(10,),\n",
    "        activation=\"relu\",\n",
    "        learning_rate_init=0.01,\n",
    "        random_state=i,  # only change random seed here\n",
    "        solver=\"adam\",\n",
    "        max_iter=500\n",
    ")\n",
    "\n",
    "    clf.fit(X_train, y_train)\n",
    "    acc = clf.score(X_test, y_test)\n",
    "    test_accuracies.append(acc)\n",
    "\n",
    "test_mean = np.mean(test_accuracies)\n",
    "test_mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9668028031056387 0.9813453450425095\n"
     ]
    }
   ],
   "source": [
    "confidence = 0.95  # Change to your desired confidence level\n",
    "t_value = scipy.stats.t.ppf((1 + confidence) / 2.0, df=rounds - 1)\n",
    "\n",
    "sd = np.std(test_accuracies, ddof=1)\n",
    "se = sd / np.sqrt(rounds)\n",
    "\n",
    "ci_length = t_value * se\n",
    "\n",
    "ci_lower = test_mean - ci_length\n",
    "ci_upper = test_mean + ci_length\n",
    "\n",
    "print(ci_lower, ci_upper)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "results[\"Method 4: Random seeds\"] = {\n",
    "    \"Test accuracy\": test_mean,\n",
    "    \"Lower 95% CI\": ci_lower,\n",
    "    \"Upper 95% CI\": ci_upper,\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br>\n",
    "<br>\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": []
   },
   "source": [
    "## Comparing the Different Confidence Interval Methods"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['Method 1: Normal approximation', 'Method 2: Bootstrap, percentile', 'Method 3: Bootstrap test set', 'Method 4: Random seeds'])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArIAAAEiCAYAAAAF9zFeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABik0lEQVR4nO3deXhNV/s38O/JdDLPIzISMpAIMcQUqSEEDdWHmiqCElVTiSoSY4WiQfF4VBJFhdZQRaNJSMzE1CIRlSZCax4SQQay3j+82T9HZg7p4fu5rlxX99prr73Wfbbmztpr7yMTQggQEREREakYtZruABERERHRy2AiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0RUw44fPw5/f38YGBhAX18ffn5+OHToUKl6QUFBkMlkpX5cXFwU6uXn5+PTTz+FhYUF6tSpg1mzZuHFL3G8fPky9PX1kZiY+FrHpgybNm2Cu7s7dHR0IJPJcObMGcyYMQMymaxKxzs4OCAoKOj1dvINeJVx/PDDD4iMjFRqf16n9u3bo3379jXdDVIBGjXdASKid1lKSgratWuH5s2bY926dRBCYMGCBejQoQP27dsHHx8fhfo6OjrYu3dvqbLnLViwAFu3bsXKlSuRm5uLzz77DE5OThg4cKBUJyQkBL1790aHDh1e3+CU4NatWxg0aBC6dOmCFStWQC6Xo379+hg2bBi6dOlS0917o7Zt2wZDQ8OXOvaHH37AuXPnMG7cOOV2iqiGMZElIqpB06dPh7GxMeLi4qCrqwsA6NixI5ycnDBx4sRSM7Nqampo2bJlhW3u2rULY8aMwYcffggAOHr0KHbu3CklsrGxsTh+/DguXLjwGkakXBcvXkRRUREGDhwIX19fqVxXVxd16tSpwZ69eV5eXjXdhVIeP35c6g8pojeJSwuIiGrQoUOH0L59eymJBQADAwO0a9cOhw8fxrVr16rdZn5+PvT09KRtfX195OfnAwDu37+PcePGYfHixTA3N69Wu/fv38fnn38OJycnyOVyWFpaIiAgQCEhvnv3LkaNGoXatWtDS0sLTk5OmDp1KgoKChTakslkGD16NNatWwdXV1fo6urC09MTO3fulOoEBQWhTZs2AIC+fftCJpNJt5vLWlpQVFSE0NBQWFtbQ1dXF23atMHx48fLHMv169cxYsQI1KlTB1paWnB0dMTMmTPx5MkTqU5WVhZkMhkWLlyIxYsXw9HREfr6+vDx8cHRo0dLtXns2DH06NEDZmZm0NbWRt26dUvNgP7555/o378/LC0tIZfL4erqiuXLl1cefJReWpCUlASZTIaNGzdi6tSpqFWrFgwNDdGxY0ekp6dL9dq3b49du3bh8uXLCktSShQWFmLOnDlwcXGBXC6HhYUFhgwZglu3bpU6f/fu3bF161Z4eXlBW1sbM2fOhJeXF9q2bVuqv0+fPkXt2rXxwQcfSGUzZ85EixYtYGpqCkNDQzRp0gRr1qwptfSlLCtXroSnpyf09fVhYGAAFxcXfPnll1WKHb29OCNLRFSDCgsLIZfLS5WXlJ09exY2NjZS+ePHj2FtbY1bt27BxsYGPXv2xKxZs2BqairVadWqFaKiohAYGIi8vDxs2rQJY8eOBQCEhobC3d0dH3/8cbX6+eDBA7Rp0wZZWVmYPHkyWrRogby8POzfvx/Xrl2Di4sL8vPz4efnh4yMDMycORMeHh44cOAA5s2bhzNnzmDXrl0Kbe7atQspKSmYNWsW9PX1sWDBAvTq1Qvp6elwcnLC9OnT0bx5c3z66af46quv4OfnV+Gt9eHDh+P777/HxIkT0alTJ5w7dw4ffPABHjx4oFDv+vXraN68OdTU1BAWFoa6deviyJEjmDNnDrKyshAdHa1Qf/ny5XBxcZHWmE6fPh0BAQHIzMyEkZERAGDPnj3o0aMHXF1dsXjxYtjZ2SErKwu//fab1E5qaipatWoFOzs7LFq0CNbW1tizZw/GjBmD27dvIzw8vFqfSYkvv/wSrVu3xnfffYfc3FxMnjwZPXr0QFpaGtTV1bFixQp88sknyMjIwLZt2xSOLS4uRmBgIA4cOIDQ0FC0atUKly9fRnh4ONq3b48TJ04ozLieOnUKaWlpmDZtGhwdHaGnp4datWph7Nix+PPPP+Hs7CzV/e233/DPP/9gyJAhUllWVhZGjBgBOzs7AM/uFnz22Wf4+++/ERYWVu4YY2NjMWrUKHz22WdYuHAh1NTUcOnSJaSmpr5UzOgtIoiIqMY0btxY1K9fXzx9+lQqKyoqEk5OTgKA+OGHH6TyxYsXi8WLF4vffvtN/Pbbb2Lq1KlCV1dXuLi4iAcPHkj1rl+/Lpo1ayYACAAiICBAPHr0SOzfv1/o6OiIixcvVrufs2bNEgBEfHx8uXX++9//CgBi8+bNCuXz588XAMRvv/0mlQEQVlZWIjc3V6HfampqYt68eVLZvn37BADx448/KrQZHh4unv8VlpaWJgCI8ePHK9TbsGGDACAGDx4slY0YMULo6+uLy5cvK9RduHChACDOnz8vhBAiMzNTABCNGjUST548keodP35cABAbN26UyurWrSvq1q0rHj9+XG58/P39RZ06dUROTo5C+ejRo4W2tra4e/duuccKIYS9vb3COEpiExAQoFBv8+bNAoA4cuSIVNatWzdhb29fqs2NGzcKAGLLli0K5SkpKQKAWLFihcL51dXVRXp6ukLd27dvCy0tLfHll18qlPfp00dYWVmJoqKiMsfz9OlTUVRUJGbNmiXMzMxEcXGxtM/X11f4+vpK26NHjxbGxsZltkPvNi4tICKqQZ999hkuXryI0aNH4++//8aVK1cwcuRIXL58GcCzNbElxo8fj/Hjx6NTp07o1KkT5syZg++//x4XLlzA6tWrpXpWVlY4duwYMjMz8ffff2PXrl1QV1fHiBEjMG3aNDg7O2PLli1wd3eHqakpunfvjitXrlTYz19//RX169dHx44dy62zd+9e6OnpSWtzS5TcDn/xDQl+fn4wMDBQ6LelpaU09urYt28fAGDAgAEK5X369IGGhuLNx507d8LPzw+1atXCkydPpJ+uXbsCAJKTkxXqd+vWDerq6tK2h4cHAEj9vHjxIjIyMjB06FBoa2uX2b/8/HwkJiaiV69e0NXVVThvQEAA8vPzy1yuUBXvv/++wvaL/avIzp07YWxsjB49eij0qXHjxrC2tkZSUlKptuvXr69QZmZmhh49emDt2rUoLi4GANy7dw8///wzPv74Y4X47927Fx07doSRkRHU1dWhqamJsLAw3LlzBzdv3iy3n82bN8f9+/fRr18//Pzzz7h9+3alY6N3AxNZIqIaFBwcjIiICKxbtw516tSBnZ0dUlNTMXHiRABA7dq1Kzy+V69e0NPTK5UEyWQyODg4oFatWgCAiIgIqKmpYdKkSbhw4QIGDBiARYsW4erVqzA3N1d4o0FZbt26VenDVXfu3IG1tXWptauWlpbQ0NDAnTt3FMrNzMxKtSGXy/H48eMKz1PeuQHA2tpaoVxD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AwYMgLm5OQIDA3HgwAFkZmYiOTkZY8eOxdWrVwE8+yKHefPmYcmSJbh48SLOnj2L6OhoLF68GADQv39/qKmpYejQoUhNTcXu3btLJagV9YGIiN5O6moyhPd4tiTvxTS1ZDu8h9u/Mol9k5jIvsDQ0LDC76OfPXs2wsLCMG/ePLi6usLf3x+//PKLlCDWrl0bM2fOxBdffAErKytpqUJlZDIZtm/fDhMTE7Rr1w4dO3aEk5MTNm3aJNXp27cvwsLCMHnyZDRt2hSXL19WeCjoVaSnpyMnJ6faxwUHB6OoqAjffvstLCwsEBMTgx9//BFubm6IiIgod9awIlUZ55gxY/D555/j888/R6NGjRAXF4cdO3bA2dm52ueriJaWFqZMmQIPDw+0a9cO6urqiI2NBQDo6upi//79sLOzwwcffABXV1cEBwfj8ePH0jU0bNgwfPfdd4iJiUGjRo3g6+uLmJgY6XrR19fHL7/8gtTUVHh5eWHq1KmYP39+lftARERvry4NbbByYBNYG2krlFsbaWPlwCbo0tCmhnr27yETVVmkR0QqKzc3F0ZGRrh9+zbXyL6ioqIi7N69GwEBAbyF+4oYS+VhLJXn3xrLp8UCxzPv4uaDfFgaaKO5o+m/fib2zp07MDc3R05OToUThK+Ka2SJiIiI/sXU1WTwqcuJiLJwaQERERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFKYiJLRERERCqJiSwRERERqSQmskRERESkkpjIEhEREZFK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T54s7t27p1APgIiOji63nX379gk8e1hRABAaGhrC0dFRTJw4UeTl5Un1Hj9+LD777DNhbm4u5HK5aN26tTh+/LhCW0lJSaJZs2ZCS0tLWFtbi8mTJ4uioiJpf3p6umjZsqXQ0dERAERmZqaYPXu2cHV1FTo6OsLU1FQEBgaKv/76Szpm9erVwtbWVqipqQlfX18hRPmf7Q8//CAcHByEXC4XPj4+YseOHQKAOH36tMJYf/nlF+Hu7i60tLREs2bNxJkzZ8qNjxBC7NixQ9SrV09oaGgIe3t7qTwuLk60atVK6OjoCENDQ9G8eXPxv//9TwghxLZt20SLFi2EoaGh0NPTEy1bthQJCQnSsUeOHBEeHh5CLpeL8v5ZVdZGYWGhCAsLEw4ODkJTU1NYW1uLXr16iT/++EOqM3LkSGFmZiYAiPDw8ArHWSInJ0cAELdv365SfSpfYWGh2L59uygsLKzprqg8xlJ5GEvlUdVYPnlaLA5fui22n74qDl+6LZ48La7pLonbt28LACInJ+e1nkcmhHh3vseM3ipJSUnw8/PDvXv3+I1XFcjNzYWRkRFu377Nh71eUVFREXbv3o2AgACuRXxFjKXyMJbKw1gqz507d2Bubo6cnBwYGhq+tvOo5BpZIiIiIiImskRERESkklTyYS8i4NlXw3JlDBER0buLM7JEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqiYksEREREakkJrJEREREpJKYyBIRERGRSmIiS0REREQqSWUT2fbt22PcuHFKb3fGjBlo3Lix0tslKktMTAyMjY2lbV5/REREVaf0RDYoKAgymQwjR44stW/UqFGQyWQICgqqcntJSUmQyWS4f/++8jr5Cn7//Xf069cPtra20NHRgaurK5YsWVLtdkrGVfKjo6MDd3d3/O9//1N6n6ub9GdlZUEmk+HMmTNK78u7zMHBAZGRkQplffv2xcWLF2umQ0REVGVPiwWOZNzBz2f+xpGMO3haLGq6SwRA43U0amtri9jYWHzzzTfQ0dEBAOTn52Pjxo2ws7N7Had8Y06ePAkLCwusX78etra2OHz4MD755BOoq6tj9OjR1W4vPT0dhoaGePz4MX755ReEhISgbt266NChw2vovXIVFhZCS0urprvxSoQQePr0KTQ0Xss/hUrp6OhI/0aIiOjfKe7cNcz8JRXXcvKlMhsjbYT3cEOXhjY12DN6LUsLmjRpAjs7O2zdulUq27p1K2xtbeHl5aVQVwiBBQsWwMnJCTo6OvD09MRPP/0E4NnMoJ+fHwDAxMSk1GxucXExQkNDYWpqCmtra8yYMUOh7ezsbAQGBkJfXx+Ghobo06cPbty4oVAnIiICVlZWMDAwwNChQ5Gfn4+KBAcHY+nSpfD19YWTkxMGDhyIIUOGKIy1OiwtLWFtbQ1HR0eMGTMGDg4OOHXqlLS/oKAAY8aMgaWlJbS1tdGmTRukpKQotJGcnIzmzZtDLpfDxsYGX3zxBZ48eQLg2Qx5cnIylixZIs3+ZmVl4d69exgwYAAsLCygo6MDZ2dnREdHAwAcHR0BAF5eXpDJZGjfvr3UVs+ePTFv3jzUqlUL9evXBwCsX78e3t7eMDAwgLW1Nfr374+bN29K/SuZfd61axc8PT2hra2NFi1a4OzZs9WKVcn5Z86cCUtLSxgaGmLEiBEoLCyU6lR0PT3flz179sDb2xtyuRwHDhxAcXEx5s+fj3r16kEul8POzg5z586Vjvv777/Rt29fmJiYwMzMDIGBgcjKyirVt4ULF8LGxgZmZmb49NNPUVRUBODZrPjly5cxfvx46XMASi8tKEt0dDRcXV2hra0NFxcXrFixolpxIyKilxd37hpC1p9SSGIB4HpOPkLWn0LcuWs11DMCXuMa2SFDhkiJEQBERUUhODi4VL1p06YhOjoaK1euxPnz5zF+/HgMHDgQycnJsLW1xZYtWwA8m7m8du2awm38tWvXQk9PD8eOHcOCBQswa9YsxMfHA3iW0PTs2RN3795FcnIy4uPjkZGRgb59+0rHb968GeHh4Zg7dy5OnDgBGxubl0oScnJyYGpqqlAmk8kQExNT5TaEEIiLi8OVK1fQokULqTw0NBRbtmzB2rVrcerUKdSrVw/+/v64e/cugGcJVkBAAJo1a4bff/8dK1euxJo1azBnzhwAwJIlS+Dj44Phw4fj2rVruHbtGmxtbTF9+nSkpqbi119/RVpaGlauXAlzc3MAwPHjxwEACQkJuHbtmkKSnpiYiLS0NMTHx2Pnzp0Ans3Mzp49G7///ju2b9+OzMzMMpePTJo0CQsXLkRKSgosLS3x/vvvS4leVZWcf9++fdi4cSO2bduGmTNnSvsrup6eFxoainnz5iEtLQ0eHh6YMmUK5s+fL8Xlhx9+gJWVFQDg0aNH8PPzg76+Pvbv34+DBw9CX18fXbp0UUii9+3bh4yMDOzbtw9r165FTEyMdA1s3boVderUwaxZs6TPoSpWr16NqVOnYu7cuUhLS8NXX32F6dOnY+3atdWKGxHRu+JR4ZNX+il4+n9tPMgvQviO8yhrEUFJ2YwdqXiQX/TK533xh6rmtd1PHTRoEKZMmSKttzx06BBiY2ORlJQk1Xn48CEWL16MvXv3wsfHBwDg5OSEgwcPYtWqVfD19ZUSREtLy1IzVx4eHggPDwcAODs749tvv0ViYiI6deqEhIQE/PHHH8jMzIStrS0AYN26dXB3d0dKSgqaNWuGyMhIBAcHY9iwYQCAOXPmICEhodJZ2ecdOXIEmzdvxq5duxTKGzRoACMjo0qPr1OnDoBnM6/FxcWYNWsW2rVrJ8Vn5cqViImJQdeuXQE8S2zi4+OxZs0aTJo0CStWrICtrS2+/fZbyGQyuLi44J9//sHkyZMRFhYGIyMjaGlpQVdXF9bW1tJ5s7Oz4eXlBW9vbwDP1m+WsLCwAACYmZkpHAMAenp6+O677xSWFDz/B4qTkxOWLl2K5s2bIy8vD/r6+tK+8PBwdOrUCcCzP0Lq1KmDbdu2oU+fPpXGqYSWlhaioqKgq6sLd3d3zJo1C5MmTcLs2bPx+PHjSq+nErNmzZL68uDBAyxZsgTffvstBg8eDACoW7cu2rRpAwCIjY2FmpoavvvuO2kmNTo6GsbGxkhKSkLnzp0BPLtr8O2330JdXR0uLi7o1q0bEhMTMXz4cJiamkJdXV2ata6q2bNnY9GiRfjggw8APJstT01NxapVq6S+vqigoAAFBQXSdm5uLgCgqKio2n84kKKS+DGOr46xVB7GUpFb2G+v2IIGQo/vrVJNAeB6bj4azXjVc5b25+zOSm/zTXpT1+NrS2TNzc3RrVs3rF27FkIIdOvWTZrxK5Gamor8/HwpoShRWFhYaglCWTw8PBS2bWxspFvaaWlpsLW1lZJYAHBzc4OxsTHS0tLQrFkzpKWllXoozcfHB/v27avSGM+fP4/AwECEhYWVGsOFCxeq1MaBAwdgYGCAgoICHD9+HKNHj4apqSlCQkKQkZGBoqIitG7dWqqvqamJ5s2bIy0tTRqnj4+PlGABQOvWrZGXl4erV6+WuyY5JCQEvXv3xqlTp9C5c2f07NkTrVq1qrS/jRo1KrUu9vTp05gxYwbOnDmDu3fvori4GMCzZNnNzU2qV5JcAoCpqSkaNGggjaOqPD09oaurq9BmXl4erly5gps3b1b5eipJ4IFnMSwoKCh3XfLJkydx6dIlGBgYKJTn5+cjIyND2nZ3d4e6urq0bWNjU+3lE8+7desWrly5gqFDh2L48OFS+ZMnTyr8I2nevHkKs9Ql9u3bpxA7enkld37o1TGWysNYlqiZZx6Ubffu3TXdhVfy6NGjN3Ke1/ppBwcHSw9ALV++vNT+koRn165dqF27tsI+uVxeafuampoK2zKZTGpTCKGQ3JUor7y6UlNT8d5772H48OGYNm3aS7fj6OgozTS7u7vj2LFjmDt3LkJCQiDEsxsXL/b3+TGUNZ7yjnte165dcfnyZezatQsJCQno0KEDPv30UyxcuLDC/urp6SlsP3z4EJ07d0bnzp2xfv16WFhYIDs7G/7+/gq33cujjM+ipJ3qXE/Pj6Oyh62Ki4vRtGlTbNiwodS+ktlroOLr8WWUHLt69WqF5SYAFBLmF02ZMgUTJkyQtnNzc2Fraws/Pz+YmZm9dH/o2QxDfHw8OnXqVOrzpuphLJWHsVTUvuPL35YvKnqCvXv34r333oOmpgZSsu5h2LrTlR733SAvNHMweenzlkVXS7UT8jt37ryR87zWKD2/htDf37/Ufjc3N8jlcmRnZyvc9n1eyezf06dPq3VuNzc3ZGdn48qVK9KsbGpqKnJycuDq6goAcHV1xdGjR/Hxxx9Lxx09erTSts+fP4/33nsPgwcPVnggSBnU1dXx+PFjAEC9evWgpaWFgwcPon///gCe/Q/rxIkT0uu03NzcsGXLFoWE9vDhwzAwMJCSOS0trTLjZ2FhgaCgIAQFBaFt27bSGtbqxPzChQu4ffs2IiIipDifOHGizLpHjx6VZojv3buHixcvwsXFpaqhAfDs9WePHz+Wks+jR49CX18fderUgYmJSaXXU1mcnZ2ho6ODxMREaZnJ85o0aYJNmzZJD5i9rPI+h/JYWVmhdu3a+OuvvzBgwIAqHyeXy8v8Q1BTU5O/5JSEsVQexlJ5GMtnjF4hBkVFRZCrA0Z62tDU1ISfqzZsjNJwPSe/zHWyMgDWRtrwc7WBuppyJmbeFm/qWnytX4igrq6OtLQ0pKWllTmDZGBggIkTJ2L8+PFYu3YtMjIycPr0aSxfvlx6mMXe3h4ymQw7d+7ErVu3kJeXV6Vzd+zYER4eHhgwYABOnTqF48eP4+OPP4avr690W3ns2LGIiopCVFQULl68iPDwcJw/f77Cds+fPw8/Pz906tQJEyZMwPXr13H9+nXcunVLoZ6Liwu2bdtWaT9v3ryJ69ev4/Lly/jxxx+xbt06BAYGAng2axgSEoJJkyYhLi4OqampGD58OB49eoShQ4cCePZu3itXruCzzz7DhQsX8PPPPyM8PBwTJkyAmtqzj9fBwQHHjh1DVlYWbt++jeLiYoSFheHnn3/GpUuXcP78eezcuVNK8C0tLaGjo4O4uDjcuHEDOTk55fbfzs4OWlpaWLZsGf766y/s2LEDs2fPLrPurFmzkJiYiHPnziEoKAjm5ubo2bNnpTF6XmFhIYYOHSo9qBYeHo7Ro0dDTU2tStdTWbS1tTF58mSEhobi+++/R0ZGBo4ePYo1a9YAAAYMGABzc3MEBgbiwIEDyMzMRHJyMsaOHYurV69Wue8ODg7Yv38//v77b9y+fbtKx8yYMQPz5s3DkiVLcPHiRZw9exbR0dFYvHhxlc9LREQvR11NhvAez5bIvZimlmyH93BjEluDXvs3exkaGlY4izV79myEhYVh3rx5cHV1hb+/P3755RfpFVC1a9fGzJkz8cUXX8DKyqrK72qVyWTYvn07TExM0K5dO3Ts2BFOTk7YtGmTVKdv374ICwvD5MmT0bRpU1y+fBkhISEVtvvjjz/i1q1b2LBhA2xsbKSfZs2aKdRLT0+vMAEs0aBBA9jY2KBevXqYPHkyRowYgWXLlkn7IyIi0Lt3bwwaNAhNmjTBpUuXsGfPHpiYmEjx2b17N44fPw5PT0+MHDkSQ4cOVVjuMHHiRKirq8PNzU269a+lpYUpU6bAw8MD7dq1g7q6OmJjYwEAGhoaWLp0KVatWoVatWpJiXVZLCwsEBMTgx9//BFubm6IiIgod3lCREQExo4di6ZNm+LatWvYsWOHwnrbqrzpoUOHDnB2dka7du3Qp08f9OjRQ+G1a5VdT+WZPn06Pv/8c4SFhcHV1RV9+/aV1lvr6upi//79sLOzwwcffABXV1cEBwfj8ePH1ZqhnTVrFrKyslC3bl2FJQkVGTZsGL777jvExMSgUaNG8PX1RUxMTKXjISIi5ejS0AYrBzaBtZG2Qrm1kTZWDmzC98jWMJkoWVBJ9JokJSXBz88P9+7dK/edqVlZWXB2dkZqaiqcnZ3LrBMUFIT79+9j+/btr6+zb6Hc3FwYGRnh9u3bXCP7ioqKirB7924EBATwFu4rYiyVh7FUnopi+bRY4HjmXdx8kA9LA200dzTlTGwF7ty5A3Nzc+Tk5LzSsrzKqPZKYnprxMXF4ZNPPik3iSUiIqpJ6moy+NTlZMC/DRNZ+ld48TVoRERERJVhIkuvXfv27aGMFSzV+aY0IiIievu99oe9iIiIiIheByayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBERERGpJCayRERERKSSmMgSERERkUpiIktEREREKomJLBER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",
      "text/plain": [
       "<Figure size 700x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "labels = list(results.keys())\n",
    "\n",
    "means = np.array([results[k][\"Test accuracy\"] for k in labels])\n",
    "lower_error = np.array([results[k][\"Lower 95% CI\"] for k in labels])\n",
    "upper_error = np.array([results[k][\"Upper 95% CI\"] for k in labels])\n",
    "\n",
    "asymmetric_error = [means - lower_error, upper_error - means]\n",
    "\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 3))\n",
    "ax.errorbar(means, np.arange(len(means)), xerr=asymmetric_error, fmt=\"o\")\n",
    "ax.set_xlim([0.75, 1.0])\n",
    "ax.set_yticks(np.arange(len(means)))\n",
    "ax.set_yticklabels(labels)\n",
    "ax.set_xlabel(\"Prediction accuracy\")\n",
    "ax.set_title(\"95% confidence intervals\")\n",
    "\n",
    "plt.grid()\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
